想必大家都有遇過網頁上有些互動功能,像是遊戲驗證、加密小工具,甚至會要求輸入密碼才能看到某些內容吧?
其實,背後可能用到的就是 WebAssembly(Wasm)。
在 CTF 的題目裡,WASM 不只是加速程式或執行複雜邏輯,它裡面也可能藏著敏感資訊,甚至直接包含 flag。
所以說,學會觀察、分析 WASM,就是 Web 題裡一個有趣又實用的武器之一。
WASM(WebAssembly) 是一種可以在瀏覽器執行的低階二進制指令集,它比 JavaScript 執行快,也可以用多種語言編譯而來(C/C++、Rust…)。
常見用途像是:
在 CTF 中,WASM 最常被用來:
i32.const 8
:推一個 i32 常數到 stack(此例為數值 8)local.get $varX
/ local.set $varX
:讀取 / 寫入函式的 local 變數(暫存槽)。global.get $global0
:讀取 module 的全域變數(例如 stack base、heap base)i32.load
:從某個位址開始,讀 4 bytes (32-bit) 出來當成整數。i32.load8_u
:從某個位址開始,讀 1 byte (8-bit),再轉成整數(自動補 0 變成 i32)。i32.store
:把一個 4 bytes (32-bit) 的整數寫到某個位址。i32.store8
:把一個 1 byte (8-bit) 的數字寫到某個位址。i32.add
/ i32.sub
:加減整數。i32.xor
:位元 XOR。i32.and
:位元 AND。i32.eq
/ i32.ne
/ i32.eqz
:比較結果產生布林(0/1)。block
/ loop
/ br_if
/ br
/ end
:WASM 的分支/迴圈結構,用來寫 while/for 或早期跳出。return
:函式回傳。call $strcmp
:呼叫另一個 exported 或內部函式並使用其回傳值。return
:把 stack 的值當回傳結果彈出。這題只有一個輸入flag的地方,反正解法絕對不會是通靈出flag
F12之後去看一下js檔案,可以發現它會把 WASM 載入到 JS 環境
到wasm檔案看一下,可以發現在copy_char那裏會對flag做xor 8,最下面給的"xakgK\5cNsl<8?nmi:<i;0j9:;?nm8i=0??:=njn=9u\00\00”
就是做xor 8之後的結果,所以我們只要再對此字串做一次xor就會獲得flag了
以上就是今天的內容啦
想看更多,記得明天再來喔~